package com.shujia.data_safe;

/*


我们把该类的构造器使用private修饰，从而把该类的所有构造器隐藏起来。
说明不能在类的外部创建类的对象, 只能在类的内部完成创建
则需要提供一个public方法作为该类的访问点，用于创建该类的对象并返回，且必须使用static修饰
该类还必须缓存已经创建的对象，必须用static修饰

 */
public class Singleton {

    // 懒汉式, 单例在系统里面只能有一个对象
    private volatile static Singleton singleton;

    public static void main(String[] args) {
        // 很多地方可能都会用到单例
        // 各种线程来获取单例, 这些线程无法共享某个资源
        // 一个类对应的 Class 对象在系统里是问题的
    }

    private Singleton() {

    }

    public static Singleton getInstance() {
        // 单例模式, 很经典double check
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    // 进来不止一个线程, 多次创建对象
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

}
